<?php
declare (strict_types=1);

namespace app\common\library\upload;

//抽象类 - 实现文件上传继承此类
abstract class Driver
{

    public $error = '';

    /**
     * @title 普通文件上传 (大小不超过5MB)
     * @param string $file 上传的input框的name值
     * @param string $save_name 保存的文件名,不传默认生成随机文件名
     * @return array
     * *@author wanghao
     */
    abstract public function upload(string $file, string $save_name = ''): array;

    /**
     * @title 分片上传大文件
     * @param string $file 上传的input框的name值
     * @param string $save_name 保存的文件名
     * @return array
     * @author wanghao
     */
    abstract public function uploadBig(string $file, string $save_name): array;

    /*
     * @title 获取文件上传的错误
     * @param int $code 错误码
     * @return string
     * */
    public function getError(int $code): string
    {
        switch ($code) {
            case 1:
                $msg = '上传失败,文件太大';
                break;
            case 2:
                $msg = '上传失败,文件太大';
                break;
            case 3:
                $msg = '上传失败,只有部分文件上传';
                break;
            case 4:
                $msg = '没有找到上传文件';
                break;
            case 5:
                $msg = '未知错误';
                break;
            case 6:
                $msg = '系统错误,找不到临时文件夹';
                break;
            case 7:
                $msg = '文件写入失败';
                break;
            default:
                $msg = '未知错误';
        }
        return $msg;
    }

    /*
     * @title 检测上传正确性
     * @param string $file 上传的input框的name值
     * @return bool
     * */
    public function checkFile(string $file): bool
    {
        //检查文件
        if (empty($_FILES[$file])) {
            $this->error = '上传的文件不存在';
            return false;
        }
        //检查上传错误
        if ($_FILES[$file]['error'] != 0) {
            $this->error = $this->getError($_FILES[$file]['error']);
            return false;
        }
        return true;
    }

    /*
     * @title 检测文件后缀
     * @param string $ext 上传的input框的name值
     * @return bool
     * */
    public function checkExt(string $ext): bool
    {
        if ($ext == '' || !in_array($ext, config('system.upload')['ext'])) {
            $this->error = '不允许上传的文件类型:' . $ext;
            return false;
        }
        return true;
    }
}
